package com.sandyz.virtualcam.hooks

import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.async
import kotlinx.coroutines.cancel
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlin.coroutines.CoroutineContext

/**
 * 协程测试类
 * 
 * 主要功能：
 * 1. 协程作用域测试
 * 2. 协程生命周期管理
 * 3. 异常处理测试
 * 
 * 实现细节：
 * - 自定义协程作用域
 * - 使用IO调度器
 * - 异常处理器
 * - 定时任务测试
 * 
 * @author sandyz987
 * @date 2023/12/6
 */

/**
 * 1. 自定义协程作用域
 * 
 * 实现细节：
 * 1.1 使用Job管理生命周期
 * 1.2 配置IO调度器
 * 1.3 添加异常处理
 * 1.4 设置协程名称
 */
class MyCoroutineScope : CoroutineScope {
    private val job: Job = Job()
    override val coroutineContext: CoroutineContext
        get() = Dispatchers.IO + CoroutineName("Test") + job + CoroutineExceptionHandler {
                coroutineContext, throwable ->
            println("throwable: $throwable in context $coroutineContext")
        }
}

/**
 * 2. 主函数测试
 * 
 * 测试流程：
 * 2.1 创建协程作用域
 * 2.2 启动定时任务
 * 2.3 取消协程
 * 2.4 等待完成
 */
fun main() = runBlocking {
    // 2.1 创建协程作用域
    val coroutineScope = MyCoroutineScope()
    
    // 2.2 启动定时任务
    coroutineScope.launch {
        while (true) {
            delay(500L)
            println("hello")
        }
    }
    
    // 2.3 取消协程
    coroutineScope.cancel()
    
    // 2.4 等待完成
    delay(3000L)
}

/**
 * 3. 日志打印工具
 * 
 * @param msg 要打印的消息
 */
fun println(msg: String) {
    kotlin.io.println("[${Thread.currentThread().name}]$msg")
}